package org.Yiran.timetale_re.worldgen.feature.config;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;

/**
 * 水晶簇配置类
 * <p>
 * 用于配置水晶簇生成的各种参数，使生成逻辑更加灵活和可配置。
 *
 * @param minClusterSize            水晶簇最小大小
 * @param maxClusterSize            水晶簇最大大小
 * @param minCrystalLevel           水晶最小等级
 * @param maxCrystalLevel           水晶最大等级
 * @param surfaceGenerationChance   在地表生成的概率
 * @param caveGenerationChance      在洞穴中生成的概率
 * @param largeCaveGenerationChance 在大型矿洞中生成的概率
 */
public record CrystalClusterConfig(int minClusterSize, int maxClusterSize, int minCrystalLevel, int maxCrystalLevel,
                                   double surfaceGenerationChance, double caveGenerationChance,
                                   double largeCaveGenerationChance) implements FeatureConfiguration {

    public static final Codec<CrystalClusterConfig> CODEC = RecordCodecBuilder.create(builder -> builder.group(
            Codec.INT.fieldOf("min_cluster_size").forGetter(config -> config.minClusterSize),
            Codec.INT.fieldOf("max_cluster_size").forGetter(config -> config.maxClusterSize),
            Codec.INT.fieldOf("min_crystal_level").forGetter(config -> config.minCrystalLevel),
            Codec.INT.fieldOf("max_crystal_level").forGetter(config -> config.maxCrystalLevel),
            Codec.DOUBLE.fieldOf("surface_generation_chance").forGetter(config -> config.surfaceGenerationChance),
            Codec.DOUBLE.fieldOf("cave_generation_chance").forGetter(config -> config.caveGenerationChance),
            Codec.DOUBLE.fieldOf("large_cave_generation_chance").forGetter(config -> config.largeCaveGenerationChance)
    ).apply(builder, CrystalClusterConfig::new));

}